package com.ym.medical.dao;

import com.ym.medical.domain.entity.InquiryOrderEntity;
import com.ym.medical.domain.param.ConsultingOrderParam;
import com.ym.medical.domain.param.TdRecordExampleParam;
import com.ym.medical.domain.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

import java.util.Date;
import java.util.List;

/**
 * 问诊订单Dao接口
 *
 * @author ym
 * @date 2020-08-24
 */
@Repository
public interface InquiryOrderDao extends Mapper<InquiryOrderEntity> {

    /**
     * 医生电话订单回显
     *

     * @param ioId
     * @return
     */
    List<OrderAndFileVO> selectOrderEcho(@Param("ioId") Long ioId);

    /**
     * 医生刷单，显示抢单台订单
     *
     * @param collect
     * @return
     */
    List<OrdersVo> getOrdersInPool(List<Long> collect);

    /**
     * 订单统计列表
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param orderType 订单类型， 01友医02个人工作室03个人订单 默认全部订单
     * @param doctorId  医生ID
     * @return
     */
    List<OrdersVo> orderReport(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("doctorType") String doctorType, @Param("orderType") String orderType, @Param("doctorId") Long doctorId);

    int updateIoStatus(@Param("ioStatus") String ioStatus, @Param("id") Long orderId);

    /**
     * 打电话相关信息
     *
     * @return
     */
    List<PhoneInfoVo> selectPhoneInfo();


    /**
     * PC咨询订单列表
     *
     * @param query
     * @return
     */
    List<ConsultingOrderVO> consultingOrderList(ConsultingOrderParam query);

    /**
     * PC咨询订单详情
     *
     * @param orderId
     * @return
     */
    ConsultingOrderInfoVO consultingOrderInfo(Long orderId);

    /**
     * 患者端，未支付订单个数
     *
     * @param userId 当前患者ID
     * @return
     */
    Integer unPayNum(Long userId);

    /**
     * 患者端，我的订单列表
     *
     * @param status
     * @return
     */
    List<MyOrderListVo> listMyOrdersPatient(@Param("userId") Long userId, @Param("status") Long status);

    /**
     * 患者端，我的订单详情
     *
     * @param orderId
     * @return
     */
    MyOrderInfoVo infoMyOrdersPatient(Long orderId);

    /**
     * 医生打电话前5分钟发送消息  注意接听电话通知
     *
     * @return
     */
    List<InquiryOrderVo> beforeFiveMinutesOrder();

    /**
     * 医生端-订单统计-总金额统计
     *
     * @param startTime
     * @param endTime
     * @param orderType
     * @param doctorId
     * @return
     */
    Double orderReportCountAmount(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("doctorType") String doctorType, @Param("orderType") String orderType, @Param("doctorId") Long doctorId);

    /**
     * 电话问诊当天总量
     *
     * @param patientId
     * @param time
     * @return
     */
    int selectCountPh(
            @Param("patientId") Long patientId,
            @Param("time") Date time);


    /**
     * 根据预约规则ID，预约时间，订单类型，获取已预约的分钟数量
     *
     * @param appointTimeRule
     * @param appointTime
     * @param ioType
     * @return
     */
    long getMinutesReserved(@Param("appointTimeRule") Long appointTimeRule, @Param("appointTime") Date appointTime, @Param("ioType") String ioType);

    /**
     * 患者下单限制
     * 	(相同医生同一患者不可重复下单)
     * @param patientId
     * @param doctId
     * @return
     */
    OrderVo samePatientLimit(
            @Param("patientId") long patientId,
            @Param("doctId") long doctId);

    /**
     * PC端-账务系统 问诊交易记录
     * @param tdRecordExampleVO 搜索条件构造
     * @return
     */
    List<InquiryTdRecordVO> listInquiryOrderRecord(TdRecordExampleParam tdRecordExampleVO);


    /**
     * 图文重复订单判断
     * @param dsId
     * @param doctId
     * @param patientId
     * @return
     */
    List<OrderVo> selectRepeatOrder(
            @Param("dsId") Long dsId,
            @Param("doctId") Long doctId,
            @Param("userId") Long userId,
            @Param("patientId") Long patientId);

    /**
     * 获取患者问医生的订单数量
     * @param doctId
     * @param patientId
     * @return
     */
    long getPatientAskNum(@Param("doctId") Long doctId,@Param("patientId")  Long patientId);

    /**
     * 查询患者本周内的义诊医生
     * @param userId
     * @return
     */
    List<Long> queryClinicTime(@Param("userId") Long userId);
}
